From: Giovanni Campagna Date: Wed, 20 Feb 2013 15:55:02 +0000 (+0100) Subject: AppDisplay: fake a release event to dnd when opening the menu X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4700 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=a50ddd6d8c288e9fc7b80a332125d63d55397012;p=gnome-shell.git AppDisplay: fake a release event to dnd when opening the menu PopupMenuManager eats the next release event, which would otherwise close the menu, so we need to tell dnd that we're handling it, and no drag should be started, so it can ungrab the pointer and restore state. https://bugzilla.gnome.org/show_bug.cgi?id=694276 --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index c247189eb..461145b2b 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -790,6 +790,7 @@ const AppIcon = new Lang.Class({ popupMenu: function() { this._removeMenuTimeout(); this.actor.fake_release(); + this._draggable.fakeRelease(); if (!this._menu) { this._menu = new AppIconMenu(this); diff --git a/js/ui/dnd.js b/js/ui/dnd.js index f7d6f1a98..f8eecd381 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -136,9 +136,10 @@ const _Draggable = new Lang.Class({ }, _ungrabActor: function() { - Clutter.ungrab_pointer(); if (!this._onEventId) return; + + Clutter.ungrab_pointer(); this.actor.disconnect(this._onEventId); this._onEventId = null; }, @@ -203,6 +204,19 @@ const _Draggable = new Lang.Class({ return false; }, + /** + * fakeRelease: + * + * Fake a release event. + * Must be called if you want to intercept release events on draggable + * actors for other purposes (for example if you're using + * PopupMenu.ignoreRelease()) + */ + fakeRelease: function() { + this._buttonDown = false; + this._ungrabActor(); + }, + /** * startDrag: * @stageX: X coordinate of event